package co.edu.uniandes.ecos.itera.tsp.mundo;

import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;

import co.edu.uniandes.ecos.itera.tsp.anotaciones.Avance;
import co.edu.uniandes.ecos.itera.tsp.anotaciones.Interrupciones;
import co.edu.uniandes.ecos.itera.tsp.anotaciones.Loc;
import co.edu.uniandes.ecos.itera.tsp.anotaciones.LogInt;
import co.edu.uniandes.ecos.itera.tsp.anotaciones.LogT;
import co.edu.uniandes.ecos.itera.tsp.anotaciones.Tiempos;

@Tiempos( { @LogT(date = "2011-03-20", min = 39, taskId = 62),
	@LogT(date = "2011-03-21", min = 118, taskId = 78)})
@Interrupciones({
@LogInt(date="2011-03-21", intId = 3, min=10, taskId=78),
@LogInt(date = "2011-03-21", intId = 4, min = 13, taskId =78)
})

@Avance(taskId=62, termino='S')	
public class EntidadReporteAvance {
	// Avance x Proyecto x Ciclo x Desarrollador
	//donde Ciclo = null ==> todos los ciclos
	//donde Desarrollador = null ==> todos los desarrolladores
	private Hashtable<Ciclo, Integer> avanceCicloTotales = new Hashtable<Ciclo, Integer>();
	private Hashtable<Ciclo, Integer> avanceCicloTerminadas = new Hashtable<Ciclo, Integer>();
	private Hashtable<Ciclo, Hashtable<Desarrollador, Integer>> avanceCicloDesaTotales = new Hashtable<Ciclo, Hashtable<Desarrollador, Integer>>();
	private Hashtable<Ciclo, Hashtable<Desarrollador, Integer>> avanceCicloDesaTerminadas = new Hashtable<Ciclo, Hashtable<Desarrollador, Integer>>();

	@Avance(taskId=78, termino='S')
	@Loc(size=36, taskId=78)
	public EntidadReporteAvance generarReporte(List<Proyecto> proyectos, int numCiclo, int codDesarrollador, String nomProyecto) {
		Proyecto proyectoAux = new Proyecto();
		Rol rolAux = new Rol();
		List<Rol> rolesAux = new ArrayList<Rol>();
		//identificar el proyecto y sacarlo para trabajar
		for (Proyecto proyecto : proyectos) {
			if (proyecto.getNombreProyecto().compareTo(nomProyecto) == 0) {
				proyectoAux = proyecto;
				//Procesar desarrolladores
				//buscar un desarrollador o enviar toda la lista
				if (codDesarrollador > 0){
					for (Rol rol : proyectoAux.listarRoles()) {
						rolAux = rol; 
						for (Desarrollador desarrollador : rol.listarDesarrolladores()) {
							if(desarrollador.getCodigo() == codDesarrollador){
								rolesAux.add(rolAux);
								//asegurar que la cota quede al final de la lista para no iterar mas
								desarrollador = rol.listarDesarrolladores().get(rol.listarDesarrolladores().size());
								rol = proyectoAux.listarRoles().get(proyectoAux.listarRoles().size());
							}
						}
					}					
				}else{
					//por defecto pasa toda la lista, si existe un codDesarrlloador is null
					rolesAux = proyectoAux.listarRoles();
				}
				//sacar el ciclo
				if(numCiclo > 0){
					for (Ciclo ciclo : proyectoAux.listarCiclos()) {
						if(ciclo.getNumeroCiclo() == numCiclo){
							procesarCiclo(ciclo, rolesAux);
							//asegurar que la cota quede al final de la lista para no iterar mas
							ciclo = proyectoAux.listarCiclos().get(proyectoAux.listarCiclos().size());
						}
					}
				}else {
					//Todos los ciclos
					for (Ciclo ciclo : proyectoAux.listarCiclos()) {
						procesarCiclo(ciclo, rolesAux);						
					}
				}
				//asegurar que la cota quede al final de la lista para no iterar mas
				proyecto = proyectos.get(proyectos.size());
			}
		}		

	return this;
	}
	
	@Loc(size=30, taskId=78)
	private void procesarCiclo(Ciclo ciclo, List<Rol> roles){
		//desarrollador
		Hashtable<Desarrollador, Integer> desarrolladorTotales;
		Hashtable<Desarrollador, Integer> desarrolladorTerminadas;
		//contar todas las tareas por el ciclo
		Integer total = new Integer(0);;
		Integer terminadas = new Integer(0);
		total = ciclo.listarTareas().size();
		for (Tarea tarea : ciclo.listarTareas()) {
			if(tarea.seHaTerminado()){
				terminadas ++;
			}
		}
		avanceCicloTotales.put(ciclo, total);
		avanceCicloTerminadas.put(ciclo, terminadas);
		
		//contar las tareas por desarrollador segun lo que llega
		Integer totalDes = new Integer(0);
		Integer terminadasDes = new Integer(0);
		for (Rol rol : roles) {
			for (Desarrollador desarrollador : rol.listarDesarrolladores()) {
				desarrolladorTotales = new Hashtable<Desarrollador, Integer>();
				desarrolladorTerminadas = new Hashtable<Desarrollador, Integer>();
				for (Tarea tarea : ciclo.listarTareas()) {
					if(desarrollador.getCodigo() == tarea.getDesarrollador().getCodigo()){
						totalDes ++;
						if(tarea.seHaTerminado()){
							terminadasDes ++;
						}
					}				
				}
				//adiciono al hastable por desarrollador
				desarrolladorTotales.put(desarrollador, totalDes);
				desarrolladorTerminadas.put(desarrollador, terminadasDes);				
				avanceCicloDesaTotales.put(ciclo, desarrolladorTotales);
				avanceCicloDesaTerminadas.put(ciclo, desarrolladorTerminadas);
			}						
		}
	}
}

